// 你了解promise么？平时用的多么？  

/*
    多，平时用的多的就考难的题
*/

//了解，平时用的也多

// promise.all 了解么 你知道有什么特性么？

// promise.all 接收一个数组    这个数组都是promise么？

// promise 是实例化的时候就执行了

// 手写一个promise.all 吧

function myPromiseAll(promiseArray){
    return new Promise((resolve,reject)=>{
         if(!Array.isArray(promiseArray)){
             return reject(new Error("传入的参数必须是数组！"))
         }
         let num = promiseArray.length;
         const res = []
         let count = 0;
         for(let i=0;i<num;i++){
             Promise.resolve(promiseArray[i]).then(value=>{
                 res[i] = value;
                 count++
                 if(count == num){
                     resolve(res)
                 }
             })
         }
    })
}

//错误写法1 有的会判断类型  
//   isPromise = Object.prototype.toString.call(promiseArray[i] === 'object Promise')
//     if(isPromise){
//         promiseArray[i].then(result =>{
//             res.push(result)
//         })
//     }else{
//         res.push(promiseArray[i])
//     }

    //问题，处理问题对结果的处理，写了两遍

    //解决的问题： Promise.resolve 会直接将它变成一个promise
//错误写法2  忽略了顺序的写法；
//  Promise.resolve(promiseArray[i]).then(value=>{
//      res.push(value);
//      if(res.length == num){
//          resolve(res)
//      }
//  })

// 正确的写法得加数字 count 标志  数量和执行结果一样的时候

//测试

const pro1 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve('1')
    }, 1000);
})

const pro2 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve('2')
    }, 2000);
})

const pro3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve('3')
    }, 3000);
})

const proArr = myPromiseAll([pro1,pro2,pro3]).then(res=>{
    console.log(res)
}).catch(error=>{
    console.log(error)
})


//手写一个promise.race吧

function promiseRace(arr){
    return new Promise((resolve,reject)=>{
        if(!Array.isArray(arr)){
            reject(new Error("传入的参数需要是数组"))
        }
        for(let i=0;i<arr.length;i++){
            Promise.resolve(arr[i]).then(res=>{
                resolve(res)
            })
        }
    })

}

const dd = promiseRace([pro1,pro2,pro3]).then(res=>{
    console.log(res)
}).catch(error=>{
    console.log(error)
})